<?php
    //v 2
    class p
    {
        static $action = array();
        static $filter = array();
        static $action_plug = array();

        //array ( plug_name => arra( tag => func))
        static $name_action = array();
        //информация о плагинах
        static $info = null;
        static $list = array();
        static $name = '';

        //добавляем событие
        public static function add_action($tag, $function_to_add, $priority = 10) 
        {
            self::$action[ $tag ][ $function_to_add ] = $priority;

            if ( !(isset(self::$name_action[ self::$name ]) and in_array( $function_to_add, self::$name_action[ self::$name ] [ $tag ]) ) )
            {
                self::$name_action[ self::$name ] [ $tag ][] = $function_to_add;  
            }

            return true;
        }

        public static function add_setting($name, $option)
        {
            $plugin_setting = (array)get_option('plugin_setting');  

            if ( !isset( $plugin_setting[self::$name]) )
            {
                $plugin_setting[self::$name] = array();   
            }

            $plugin_setting[self::$name][$name] = $option;   

            update_option('plugin_setting', $plugin_setting);
        }

        public static function remove_setting()
        {

        }

        public static function remove( $name )
        {
            //удаляем всякий мусор из имени плагина
            $name = m::check_path ( $name );

            self::inc( $name );
            self::$name = $name;

            $plugins = get_option('plugins') ;

            if ( in_array( $name, $plugins) ) 
            {
                if ( class_exists ( $name ))
                {
                    if ( method_exists( $name, 'remove') )
                    {
                        t::$class = $name;
                        call_user_func( array( $name, 'remove') );
                        t::$class = null;
                    }
                }

                echo 'удален';
                //добавляем плагин в список установленных плагинов
                foreach ($plugins as $num => $value)
                {
                    if ( $value == $name)
                    {
                        unset( $plugins[ $num ] );
                    } 
                }

                //обновляем опцию
                update_option('plugins', $plugins);

                self::$info[ $name ]['installed'] = false;
                t::remove_class( $name );
                log::add('plugins', 'Плагин '.$name. ' удален');


            }
            else
            {
                return false;
            }

        }

        //установка плагина
        public static function install( $name )
        {
            //удаляем всякий мусор из имени плагина
            $name = m::check_path ( $name );
            self::inc( $name );

            $plugins = (array)get_option('plugins') ;

            self::$name = $name;
            if ( !in_array( $name, $plugins) ) 
            {
                if ( class_exists ( $name ))
                {
                    if ( method_exists( $name, 'install') )
                    {
                        t::$class = $name; 
                        call_user_func( array( $name, 'install') );
                        t::$class = null;
                    }

                    echo 'установлен';
                    //добавляем плагин в список установленных плагинов
                    $plugins[] = $name;
                    //обновляем опцию
                    update_option('plugins', $plugins);

                    self::$info[ $name ]['installed'] = true;
                    log::add('plugins', 'Плагин '.$name. ' установлен');
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }

        //выполняет событие
        public static function do_action($tag, $name ='' )
        {
            if ( !empty($name)  )
            {
                if ( isset( self::$action[ $tag ] ) &&  isset( self::$action[ $tag ] [$name] ) )
                {
                    $param_array = explode('::', $name);

                    if ( count($param_array) == 2 && class_exists ( $param_array[0] ) )
                    {
                        if ( method_exists( $param_array[0], $param_array[1]) )
                        {
                            call_user_func( array( $param_array[0], $param_array[1]) );
                        } 
                    }
                }
            }
        }

        public static function add_filter($tag, $function, $priority = '10')
        {
            self::$filter[ $tag ][ $priority ][] = $function;

            if ( count( self::$filter[ $tag ] ) >1 )     ksort( self::$filter[ $tag ] );
            if ( count( self::$filter[ $tag ][ $priority ] ) >1 ) sort( self::$filter[ $tag ][ $priority ] );

            return true;
        }

        //подключение плагина
        public static function inc($name)
        {
            if ( is_file( PLUG_PATH . $name .'.php' ) )
            {
                include_once( PLUG_PATH . $name .'.php'); 
            }
            else
            {
                if ( is_file( PLUG_PATH . $name .'/'.$name.'.php' ) )
                {
                    include_once( PLUG_PATH . $name .'/'.$name.'.php');
                }                   
            }
        }

        //подключить все установленные плагины
        public static function include_all ()
        {
            ob_start();  
            $plugins = get_option('plugins') ;

            if ( is_array($plugins) && count($plugins) > 0 )
            {
                foreach ($plugins as $name)
                {
                    self::inc( $name );
                    //инициализация плагина
                    /*
                    class::init();
                    */
                    if ( method_exists( $name, 'init' ) )
                    {
                        self::$name = $name;
                        @ call_user_func( array($name, 'init') );
                    } 
                }
            }

            $t = ob_get_contents();
            ob_end_clean();

        }

        //сколько всего плагинов
        public static function total()
        {
            return count( self::$info );  
        }

        //$type = 'import'
        public static function type($type)
        {
            //если еще не определяли список плагинов - определяем
            if ( is_null( self::$info) )
            {
                self::get_list();
            } 

            $type_array = array();

            if ( count( self::$info ) > 0 )
            {
                foreach (self::$info as $name => $value)
                {
                    if ( isset( $value['type'] ) )
                    {
                        if ( is_array( $value['type'] ) && in_array($type, $value['type']) )
                        {
                            $type_array[] = $name;
                        }
                        else
                        {
                            if ( $value['type'] == $type)  
                            {
                                $type_array[] = $name ;
                            }
                        }
                    }

                }
            }

            return $type_array;
        }

        //получаем список плагинов
        public static function get_list()
        {
            //возвращааем список установленных плагинов
            $plug_installed_array = (array)get_option('plugins');

            //список файлов
            $plug_array =  m::file_list( PLUG_PATH );
            //список директории
            $plug_dir_array =  m::dir_list( PLUG_PATH );

            if ( count($plug_dir_array) > 0 )
            {
                foreach ($plug_dir_array as $_name)
                {
                    $plug_array[] =  $_name;
                }
            }


            if ( count($plug_array) > 0  )
            {
                foreach ($plug_array as $plug)   
                {
                    if ( is_file( PLUG_PATH . $plug) )
                    {
                        $name = strtolower( $plug );
                        $name = str_replace('.php', '', $name) ;
                        $type = 'file';
                    }
                    else
                    {
                        $name = $plug;
                        $type = 'dir';
                    }

                    p::inc( $name );

                    self::$name = $name;
                    if ( class_exists ( $name ) )
                    {
                        if ( method_exists( $name, 'info' ) )
                        {
                            self::$info[ $name ] = call_user_func( array($name, 'info') );
                        }

                        if ( method_exists( $name, 'init' ) )
                        { 
                            call_user_func( array($name, 'init') );
                        }

                        //если нет имени у плагина - задаем имя файла плагина
                        if ( !isset (  self::$info[ $name ]['title'] ) )
                        {
                            self::$info[ $name ]['title']  = $name;
                        }

                        self::$info[ $name ]['name'] = $name;
                        self::$info[ $name ]['type'] = $type;

                        //проверка. установлен ли плагин
                        if  ( in_array($name, $plug_installed_array) )
                        {
                            self::$info[ $name ]['installed'] = true;
                        }
                        else
                        {
                            self::$info[ $name ]['installed'] = false; 
                        }

                        if ( !isset( self::$info[ $name ]['title'] ) )
                        {
                            self::$info[ $name ]['title'] = $name;
                        }


                    }

                    self::$name = '';      
                }
            }

            if ( is_null( self::$info) )
            {
                self::$info = array();
            }

            asort( self::$info );
            return self::$info;
        }
    }

    //добавляем action
    function add_action($tag, $function_to_add, $priority = 10) 
    {
        p::add_action($tag, $function_to_add, $priority);

        return true;
    }

?>